package com.shareach.dao.redis.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.shareach.redis.RedisService;

@Repository("snatchRDao")
public class SnatchRDao {
	private static final String Snatch_Type = "info";
	/**
	 * 一天的时间间隔
	 */
	private static int DayTimeLong = 24*60*60;
	@Autowired
	private RedisService redisService;
	/**
	 * 标记采集电话页面是否采集过，第一个参数是网站标识，第二个参数是城市代码
	 * SortedSet，value是Id，score是时间
	 */
	private static final String Snatch_ID = "sna:id:%s:%s:%s";
	/**
	 * 采集电话的url是否采集过，主要用于列表，第一个参数是网站标识，第二个参数是城市代码
	 * SortedSet，value是url，score是时间
	 */
	private static final String Snatch_URL = "sna:url:%s:%s:%s";

	/**
	 * 每个城市的电话数量，Set，第一个参数是城市
	 */
	private static final String Snatch_Tel_List = "sna:tel:lst:%s";
	
	/**
	 * 定时采集更新匹配成功的商户添加到此队列 SortedSet, value是对应类型的优惠商户表id,Score是时间
	 */
	private static final String match_shop_Re = "sna:re:%s";
	
//	private static final String Snatch_Shop_Queue = "snatch:shop:que:";
//	private static final String Snatch_Shop_Queue_Weibo = "snatch:shop:weibo:que";
//	private static final String Snatch_Shop_Queue_Weibo = "snatch:shop:weibo:que";
//	private static final String Snatch_Shop_Baidu = "snatch:shop:baidu:que";
	
	/**
	 * 添加至待重新匹配信息列表， 商家
	 * 
	 * @param type
	 * @param id
	 */
	public void addResnatchShop(long id) {
		String key = String.format(match_shop_Re, "sh");
		String sId = String.valueOf(id);
		if (!redisService.getRedis().isContainsSortedSet(key, sId)); {
			redisService.getRedis().addSortedSet(key, sId);
		}
	}
	
	/**
	 * 读取待重新匹配信息列表, 商家
	 * 
	 * @param type
	 * @return
	 */
	public List<Long> getResnatchList(int pageNo, int pageSize) {
		String key = String.format(match_shop_Re, "sh");
		int start = (pageNo - 1) * pageSize;
		Set<String> set = redisService.getRedis().zrange(key, start, start + pageSize);
		List<Long> results = new ArrayList<Long>();
		if (set != null) {
			for (String s : set) {
				results.add(Long.parseLong(s));
			}
		}
		return results;
	}
	
	/**
	 * 从待重新匹配信息列表移除，商家
	 * 
	 * @param id
	 */
	public void removeFromResnatchList(long id) {
		String key = String.format(match_shop_Re, "sh");
		redisService.getRedis().removeSortedSet(key, String.valueOf(id));
	}
	
	/**
	 * 一旦采集了指定网站的、指定类型的数据，则调用，标记采集过了
	 * @param city
	 * @param site
	 * @param id
	 */
	public void setSnatchedSiteId(String city, String site, String id){
		redisService.getRedis().addSortedSet(String.format(Snatch_ID, site, city,Snatch_Type), id);
	}
	/**
	 * 检查指定网站的、指定类型的数据是否采集过
	 * @param city
	 * @param site
	 * @param id
	 * @return
	 */
	public boolean isSnatchedSiteId(String city, String site, String id){
		Double d = redisService.getRedis().getSetScore(String.format(Snatch_ID, site, city,Snatch_Type), id);
		return d!=null;
	}

	/**
	 * 一旦采集了指定网站、指定url、指定类型的数据，则调用，标记采集过了
	 * @param city
	 * @param site
	 * @param url
	 */
	public void setSnatchedSiteUrl(String city, String site, String url){
		redisService.getRedis().addSortedSet(String.format(Snatch_URL, site, city,Snatch_Type), url);
	}
	/**
	 * 检查指定网站、指定类型的url是否采集过
	 * @param city
	 * @param site
	 * @param url
	 * @return
	 */
	public boolean isSnatchedSiteUrl(String city, String site, String url){
		Double d = redisService.getRedis().getSetScore(String.format(Snatch_URL, site, city,Snatch_Type), url);
		if(d!=null){
			//采集更新间隔,指定时间内不更新
			return ((d+DayTimeLong*1000) < (new Date()).getTime());
		}
		return d==null;
	}

	/**
	 * 设置城市的电话号码列表
	 * @param city
	 * @param tel
	 */
	public void setCityTel(String city, String tel){
		redisService.getRedis().addSet(String.format(Snatch_Tel_List,  city), tel);
	}
	/**
	 * 获取城市的电话号码数量
	 * @param city
	 */
	public int getCityTelCount(String city){
		return redisService.getRedis().getSetCount(String.format(Snatch_Tel_List,  city));
	}
	/**
	 * remove card
	 * @param site
	 * @param siteId
	 */
	public void removeRedis(String site,String siteId){
		redisService.getRedis().removeSortedSet(String.format(Snatch_ID, site,"bankCard","info"), siteId);
	}
}
